/**
 * 工具js
 */
// 节流
let Throttle = {
	timer: null,
	flag: null,
	/**
	* 节流原理：在一定时间内，只能触发一次
	* @param {Function} func 要执行的回调函数
	* @param {Number} wait 延时的时间
	* @param {Boolean} immediate 是否立即执行
	* @return null
	*/
	Func(func, wait = 500, immediate = true) {
	    if (immediate) {
	        if (!this.flag) {
	            this.flag = true
	            // 如果是立即执行，则在wait毫秒内开始时执行
	            typeof func === 'function' && func()
	            this.timer = setTimeout(() => {
	                this.flag = false
	            }, wait)
	        }
	    } else if (!this.flag) {
	        this.flag = true
	        // 如果是非立即执行，则在wait毫秒内的结束处执行
	         this.timer = setTimeout(() => {
	            this.flag = false
	            typeof func === 'function' && func()
	        }, wait)
	    }
	}
}

// 防抖
let Debounce = {
	timeout:null,
	/**
	 * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数
	 *
	 * @param {Function} func 要执行的回调函数
	 * @param {Number} wait 延时的时间
	 * @param {Boolean} immediate 是否立即执行
	 * @return null
	 */
	debounce(func, wait = 500, immediate = false) {
	    // 清除定时器
	    if (this.timeout !== null) clearTimeout(this.timeout)
	    // 立即执行，此类情况一般用不到
	    if (immediate) {
	        const callNow = !this.timeout
	        this.timeout = setTimeout(() => {
	            this.timeout = null
	        }, wait)
	        if (callNow) typeof func === 'function' && func()
	    } else {
	        // 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时wait毫秒后执行func回调方法
	        this.timeout = setTimeout(() => {
	            typeof func === 'function' && func()
	        }, wait)
	    }
	}
}

export default {
  /**
   * 判断是否为Ios
   * */
  isIos(){
	  return uni.getSystemInfoSync().platform == 'ios' 
  },
  /**
   * 判断是否为Android
   * */
  isAndroid(){
	  return uni.getSystemInfoSync().platform == 'android'
  },
  /**
   * 判断是否为是手机app
   * */
  isApp(){
	  let result = false
	  //#ifdef APP-PLUS
		result = true
	  //#endif
	  return result
  },
  isH5(){
	  let result = false
	  //#ifdef H5
	  		result = true
	  //#endif
	  return result
  },
  isMp(){
	  let result = false
	  // #ifdef MP-WEIXIN
	  	  result = true
	  //#endif
	  return result
  },
  /**
   * 解析过滤条件
   * @param {Object} filterObject
   */
  getFilter(filterObject) {
  	var lt = ''
  	for (var filter in filterObject) {
  		var ft = filterObject[filter]
  		if (ft) lt += '(' + ft + ') and '
  	}
  	lt = lt.substring(0, lt.lastIndexOf(' and '))
  	return lt
  },
  /**
   * 字节大小转文本
   * @param {Long} limit 需要转换的字节大小
   * @return {String} 返回转换后的字符串 如:2kb
   * @author Jie.
   * */
  byteConvert(limit){
      var size = ''
      if(limit < 0.1 * 1024){                            //小于0.1KB，则转化成B
          size = limit.toFixed(2) + 'B'
      }else if(limit < 0.1 * 1024 * 1024){            //小于0.1MB，则转化成KB
          size = (limit/1024).toFixed(2) + 'KB'
      }else if(limit < 0.1 * 1024 * 1024 * 1024){        //小于0.1GB，则转化成MB
          size = (limit/(1024 * 1024)).toFixed(2) + 'MB'
      }else{                                            //其他转化成GB
          size = (limit/(1024 * 1024 * 1024)).toFixed(2) + 'GB'
      }
  
      var sizeStr = size + ''                        //转成字符串
      var index = sizeStr.indexOf('.')                    //获取小数点处的索引
      var dou = sizeStr.substr(index + 1 ,2)            //获取小数点后两位的值
      if(dou == '00'){                                //判断后两位是否为00，如果是则删除00                
          return sizeStr.substring(0, index) + sizeStr.substr(index + 3, 2)
      }
      return size
  },
   /**
    * 身份证号加密
    * @param {String} cardNumber 身份证号
    * @author wujw
    * */
   cardEncrypt(cardNumber){
   	return cardNumber.replace(/^(.{6})(?:\d+)(.{4})$/, '$1****$2');
   },
   /**
    * 数字转换，保留最后两位
    * @param {String} num 数字
    * @author lwd
    * */
   formatToFixed(num=0) {
   	var num = num*1
   	return num.toFixed(2)
   },
   /**
    * bex5请求获取到的数据转换,例：将[{name:{value:'XXX'}}]转换为[{name:'XXX'}]
    * @param {Object} data
    * @author Jie.
    */
   bex5DataToList(data = []) {
   	let dataString = JSON.stringify(data)
   	let tempData = JSON.parse(dataString)
   	return tempData.map((p) => {
   		for (var key in p) {
   			if (key == 'userdata') continue
   			if (p[key].hasOwnProperty('value')) {
   				p[key] = p[key]['value']
   			} else {
   				p[key] = null
   			}
   		}
   		if (p['userdata']['id'])
   			p['id'] = p['userdata']['id']['value']
   		return p
   	})
   },
   /**
    * 如果value小于min，取min；如果value大于max，取max
    */
   range(min = 0, max = 0, value = 0) {
       return Math.max(min, Math.min(max, Number(value)))
   },
   
   /**
    * 取一个区间数
    * @param {Number} min 最小值
    * @param {Number} max 最大值
    */
   random(min, max) {
       if (min >= 0 && max > 0 && max >= min) {
           const gab = max - min + 1
           return Math.floor(Math.random() * gab + min)
       }
       return 0
   },
   
   /**
    * 用于获取用户传递值的px值
    * 如果用户传递了'xxpx'或者'xxrpx'，取出其数值部分，如果是'xxxrpx'还需要用过uni.upx2px进行转换
    */
   getPx(value, unit = false) {
       if (test.number(value)) {
           return unit ? `${value}px` : value
       }
       // 如果带有rpx，先取出其数值部分，再转为px值
       if (/(rpx|upx)$/.test(value)) {
           return unit ? `${uni.upx2px(parseInt(value))}px` : uni.upx2px(parseInt(value))
       }
       return unit ? `${parseInt(value)}px` : parseInt(value)
   },
   
   /**
    * 进行延时，以达到可以简写代码的目的，比如
    * await uni.$u.sleep(20)将会阻塞20ms
    */
   sleep(value = 30) {
       return new Promise((resolve) => {
           setTimeout(() => {
               resolve()
           }, value)
       })
   },
   throttle: Throttle.Func,
   debounce: Debounce.debounce
}


